package gestion.camping.controleur;

import gestion.camping.connexion.Connexion;
import gestion.camping.dao.impl.PersonneDao;
import gestion.camping.dto.Personne;
import gestion.camping.utils.MessagesUtil;
import gestion.camping.vue.ViewErreur;
import gestion.camping.vue.ViewPersonneDetail;
import gestion.camping.vue.ViewPersonneListe;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;

public class PersonneController{
	
	private Personne personne;
	private String nom;
	private String prenom;
	private List<Personne> listPersonne;
	private PersonneDao personneDao = new PersonneDao(Connexion.getInstance());
	private ViewPersonneDetail frameDetail;
	private ViewPersonneListe frameListe;
	private boolean isPossibleEnregistrer;
	
	/**
	 * Constructeur du controlleur personne
	 */
	public PersonneController(){
		prenom = "";
		nom="";
		this.isPossibleEnregistrer = true;
	}
	
	public PersonneController(boolean isPossibleEnregistrer){
		this.prenom = "";
		this.nom = "";
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}

	/**
	 * Accesseur à l'attribut personne
	 * @return personne
	 */
	public Personne getPersonne() {
		return personne;
	}

	/**
	 * Permet la modification de l'attribut personne de l'instance courante
	 * @param personne
	 */
	public void setPersonne(Personne personne) {
		this.personne = personne;
	}
	
	/**
	 * Accesseur aux JPanel contenant la liste des personnes
	 * @return JPanel viewListe
	 */
	public ViewPersonneListe getViewListe(){
		
		if(listPersonne == null){
			listPersonne = new ArrayList<Personne>();
		}
		
		//On crée la fenêtre
		frameListe = new ViewPersonneListe(this);
		
		rechercher(null, null);
		
		return frameListe;
	}
	
	/**
	 * Accesseur aux JPanel contenant le détail d'une personne
	 * @return JPanel viewDetail
	 */
	public JDialog getViewDetail(){
		
		// Si personne est différent de null 
		if(personne == null){
			//on est en création
			//On crée un objet vide
			personne = new Personne();
		}
				
		//On crée la fenêtre
		frameDetail = new ViewPersonneDetail(this);
		
		frameDetail.setVisible(true);
		
		return frameDetail;
	}

	/**
	 * Accesseur à la liste des personnes
	 * @return Liste des personnes
	 */
	public List<Personne> getListPersonne() {
		return listPersonne;
	}

	/**
	 * Permet la modification de la liste de personne
	 * @param listPersonne
	 */
	public void setListPersonne(List<Personne> listPersonne) {
		this.listPersonne = listPersonne;
	}

	/**
	 * Permet la gestion de l'action utilisateur Enregistrer
	 * @param personne
	 */
	public void enregistrer(Personne personne) {
		System.out.println(personne.toString());
		
		if(personne.getDateNaissance() == null){
			JDialog viewErreur = new ViewErreur(MessagesUtil.formatMessage("erreur.date.format"));
			viewErreur.setVisible(true);
		}else {
			this.personne = personne;
			
			
			//Si l'ID est zéro
			if(personne.getId() == 0){ 
				if(isPossibleEnregistrer){
					//On est en création
					personne = personneDao.create(personne);
				}
			}else{
				//On n'est en modification
				personne = personneDao.update(personne);
			}
			frameDetail.setPersonne(personne);
		
		}		
	}

	/**
	 * Permet la gestion de l'action utilisateur Rechercher
	 */
	public void rechercher(String nom, String prenom) {
		
		//On alimente la liste des personnes
		if((nom == null || nom.equals("") )&& (prenom == null || prenom.equals(""))){
			this.listPersonne = personneDao.findAllPersonne();
		}else{
			this.listPersonne = personneDao.findByNomPrenom(nom , prenom);
			
			this.nom = nom;
			this.prenom = prenom;
		}
		
		
		
		//On met à jour la fenêtre
		frameListe.setListPersonne(listPersonne);
	}

	/**
	 * Permet la gestion de l'action utilisateur Modifier
	 * @param personne
	 */
	public void modifier(Personne personne) {
		//On affecte la personne que l'on veut modifier	
		this.personne = personne;
		
		//On locke la ligne en base de données
		if(personneDao.lock(this.personne)){
		
			//On affiche la fenêtre de détail
			this.getViewDetail();
		
		}
		
	}

	/**
	 * Permet la gestion de l'action utilisateur Retour à liste 
	 */
	public void retour() {
		if(isPossibleEnregistrer){
			personneDao.unlock(personne);
			
			//Si une recherche avait été faite
			if(listPersonne != null && listPersonne.size() > 0){
				//On effectue la dernière recherche
				rechercher(nom , prenom);
			}
		}else{
			if(listPersonne != null){
				//On recherche si la personne et déja présente dans la lite
				int i;
				for(i=0; i<listPersonne.size() && listPersonne.get(i).getId() != personne.getId(); i++);
				if(i == listPersonne.size()){
					listPersonne.add(personne);
				}else{
					listPersonne.remove(i); 
					listPersonne.add(i, personne);
				}
				
				//On met à jour la fenêtre
				frameListe.setListPersonne(listPersonne);
				
			}
		}
		
	}
	

	/**
	 * Permet la gestion de l'action utilisateur Ajouter 
	 */
	public void ajouter(){
		this.personne = new Personne();
		
		
		this.getViewDetail();
	}

	public String getPrenom() {
		return prenom;
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public boolean isPossibleEnregistrer() {
		return isPossibleEnregistrer;
	}

	public void setPossibleEnregistrer(boolean isPossibleEnregistrer) {
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}
	
}
